package com.shujia.service.impl;

import com.shujia.dao.DeptDao;
import com.shujia.pojo.Dept;
import com.shujia.service.CacheService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class CacheServiceImpl implements CacheService {

    /**
     * 由于有@Cacheable注释修饰后，当第一次调用该方法时，该方法会直接执行，
     *      并且会将执行结果存放至缓存中，在后续的调用中，可以直接去缓存中寻找对应的值，不直接执行该方法
     *
     *
     * @return
     */
    @Override
    @Cacheable(value = "cache",key = "'data'")
    public String getData() {
        System.out.println("service中的getData方法被调用了....");
        return "从MySQL中读取数据... 1";
    }

    @Autowired
    DeptDao deptDao;

    /**
     *  在 Cacheable 注解中的 key中对应单引号为固定值 #变量名 为调用方法中的参数
     *
     */
    @Override
    @Cacheable(value = "cache",key = "#deptNo")
    public Dept getDeptByNo(Integer deptNo) {
        return deptDao.getDeptByNo(deptNo);
    }


    /**
     * 虽然我们针对数据设置了 Key的过期时间，但是无法保证数据在过期时间内，不发生变化
     *  那么后续获取到的数据都是缓存中的错误数据
     *  所以在修改数据时，需要将原先缓存中的数据进行删除
     *  @CacheEvict 注解用于删除缓存数据
     */

    @Override
    @CacheEvict(value = "cache",key = "'deptNo'")
    public String updateInfo(Dept dept) {
        return deptDao.updateDept(dept);
    }

}
